package com.xianmao.common.service;

import com.xianmao.repo.base.JPAUtil;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceContextType;
import java.util.List;
import java.util.Map;

/**
 * Created by qingquan on 2017/2/18.
 */
@Service
public class DataAccessService {

    @PersistenceContext(type = PersistenceContextType.TRANSACTION, unitName="primaryPersistenceUnit")
    @Qualifier("primaryDS")
    private EntityManager em;

    /**
     * 查询一个列表
     *
     * @param jpql   JPQL 语句
     * @param params 查询参数
     * @return
     */
    public <T> List<T> findList(StringBuilder jpql, Map<String, Object> params) {

        return JPAUtil.findList(em, jpql, params);

    }

    /**
     * 根据分页查询列表数据
     *
     * @param jpql   JP QL 语句
     * @param params 查询参数
     * @param pageable 分页参数
     * @return
     */
    public <T> List<T> findList(StringBuilder jpql, Map<String, Object> params, Pageable pageable) {
        return JPAUtil.findList(em, jpql, params, pageable);
    }

    /**
     * 返回指定数量的列表数据
     * @param jpql
     * @param params
     * @param maxResult 返回数量
     * @param <T>
     * @return
     */
    public <T> List<T> findList(StringBuilder jpql,Map<String,Object> params ,int maxResult) {
        return JPAUtil.findList(em, jpql, params, maxResult);
    }

    /**
     * 查询目标页的数据
     * @param jpql JP QL 语句
     * @param params 查询参数
     * @param pageable 分页对象
     * @return
     */
    public <T> Page<T> findPage(StringBuilder jpql, Map<String,Object> params, Pageable pageable){
        return JPAUtil.findPage(em, jpql, params, pageable);
    }




    /**
     * 使用原生sql查询目标页的数据
     * @param sql 原生sql语句
     * @param params 查询参数
     * @param pageable 分页对象
     * @return
     */
    public <T> Page<T> findPageByNativeQuery(StringBuilder sql, Map<String, Object> params, Pageable pageable){
        return JPAUtil.findPageByNativeQuery(em, sql, params, pageable);
    }

    /**
     * 使用原生sql查询列表
     * @param sql 原生sql语句
     * @param params 查询参数
     * @return
     */
    public <T> List<T> findListByNativeQuery(StringBuilder sql, Map<String,Object> params) {
        return JPAUtil.findListByNativeQuery(em, sql, params);
    }

    public Object findSingleResult(StringBuilder jpql, Map<String, Object> params) {
        return JPAUtil.findSingleResult(em,jpql,params);
    }

    public <T> T findBean(StringBuilder jpql,Map<String,Object> params){
        return JPAUtil.getUniqueResult(em,jpql,params);
    }

    /**
     * 使用原生sql查询目标页的数据
     * @param sql 原生sql语句
     * @param params 查询参数
     * @param pageable 分页对象
     * @return
     */
    public <T> Page<T> findPageByNativeQuery(StringBuilder sql, Map<String, Object> params, Pageable pageable, Class<T> resultClass){
        return JPAUtil.findPageByNativeQuery(em, sql, params, pageable, resultClass);
    }
}
